// 二次封装axios
// 1.实现接口统一,请求参数统一，请求的响应结果也统一了格式。  request.get/post/delete/put/patch(url, data, config);

// 2.添加请求拦截，设置token

// 3.添加响应拦截，获取后台提供的数据

// 4.添加响应拦截，统一处理错误信息

import axios from "axios";
class Request {
  //构造函数
  constructor() {
    console.log("run...");
    //创建请求的实例对象
    this.instance = axios.create({});

    // 发送请求的拦截
    this.instance.interceptors.request.use((config) => {
      //先根据config.withoutToken判断是否需要加token在header中
      if (!config.withoutToken) {
        //给请求设置header,header上加token的配置
        config.headers = {
          Authorization: "Bearer " + localStorage.getItem("token"),
        };
      }

      //放行
      return config;
    });

    // 响应的拦截
    this.instance.interceptors.response.use(
      //响应成功的拦截
      (response) => {
        return { data: response.data, error: null }; //获取后台响应的数据给外部使用，不需要整个response对象给到外部。
      },
      //响应失败的拦截
      (error) => {
        if (error.response) {
          const status = error.response.status;
          //服务器响应了，但是报错了。状态码超过了200
          if (status >= 400 && status < 500) {
            alert(error.response.data.message);
          } else if (status >= 500) {
            alert("服务器错误");
          }
        } else if (error.request) {
          if (window.navigator.onLine) {
            alert("服务器异常");
          } else {
            alert("网络异常");
          }
        } else {
          alert("客户端错误");
        }
        return { data: null, error: error };
      }
    );
  }

  get(url, data = {}, config = {}) {
    return this.instance.request({
      url,
      method: "GET",
      params: data,
      ...config,
    });
  }

  post(url, data = {}, config = {}) {
    console.log(url, data);
    return this.instance.request({
      url,
      method: "POST",
      data,
      ...config,
    });
  }

  put(url, data = {}, config = {}) {
    return this.instance.request({
      url,
      method: "PUT",
      data,
      ...config,
    });
  }

  patch(url, data = {}, config = {}) {
    return this.instance.request({
      url,
      method: "PATCH",
      data,
      ...config,
    });
  }

  delete(url, data = {}, config = {}) {
    return this.instance.request({
      url,
      method: "DELETE",
      params: data,
      ...config,
    });
  }
}

// eslint-disable-next-line import/no-anonymous-default-export
export default new Request();
